home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Pascal Super Library
/
Pascal Super Library (CW International)(1997).bin
/
DELPHI32
/
SEARCH
/
RUBICON
/
RBUPDATE.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-10-21
|
14KB
|
497 lines
{*********************************************************}
{* RBUPDATE.PAS 1.20 *}
{* Copyright (c) Tamarack Associates 1996. *}
{* All rights reserved. *}
{*********************************************************}
{$B-} {* Boolean evaluation *}
{$G+} {* Generate 286 code *}
{$X+} {* eXtended syntax *}
UNIT rbUpdate;
INTERFACE
USES
{$IFDEF WIN32}
Windows,
{$ELSE}
WinTypes, WinProcs,
{$ENDIF}
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, StdCtrls, taRubicn, DB, DBTables, ExtCtrls, Menus;
TYPE
TStatPanel = (spCache,spMemory,spWords,spLRU);
TStatPanels = SET OF TStatPanel;
TUpdateStatsForm = CLASS(TForm)
ResetBtn: TButton;
CachePanel: TPanel;
CacheLabel: TLabel;
DiskLabel: TLabel;
ReadsLabel: TLabel;
CacheReads: TLabel;
DiskReads: TLabel;
DiskInserts: TLabel;
CacheInserts: TLabel;
InsertsLabel: TLabel;
EditsLabel: TLabel;
DiskEdits: TLabel;
DeleteLabel: TLabel;
DiskDeletes: TLabel;
MemoryPanel: TPanel;
MemCurrentLabel: TLabel;
MaximumLabel: TLabel;
MemoryLabel: TLabel;
MemUsage: TLabel;
MaxMemUsed: TLabel;
WordsPanel: TPanel;
WordsLabel: TLabel;
UnCompressed: TLabel;
Compressed: TLabel;
CompressLabel: TLabel;
CacheEdits: TLabel;
UnCompressedLabel: TLabel;
BlobLabel: TLabel;
BlobReads: TLabel;
BlobWrites: TLabel;
MemLimitLabel: TLabel;
MemoryLimit: TLabel;
UnWrittenLabel: TLabel;
FlushBtn: TButton;
LRUPanel: TPanel;
LRU: TLabel;
CompressLRU: TLabel;
FLushLRU: TLabel;
LRULabel: TLabel;
LRUCurrentLabel: TLabel;
LRUCompressLabel: TLabel;
LRUFlushLabel: TLabel;
PopupMenu1: TPopupMenu;
CacheMenuItem: TMenuItem;
MemoryMenuItem: TMenuItem;
WordsMenuItem: TMenuItem;
LRUMenuItem: TMenuItem;
ExpandMenuItem: TMenuItem;
UnWritten: TLabel;
PROCEDURE ResetBtnClick(Sender: TObject);
PROCEDURE ExpandBtnClick(Sender: TObject);
PROCEDURE HidePanelDblClick(Sender: TObject);
PROCEDURE FormDblClick(Sender: TObject);
PROCEDURE MenuItemClick(Sender: TObject);
PROCEDURE FlushBtnClick(Sender: TObject);
PROCEDURE FormShow(Sender: TObject);
PRIVATE
FExpanded : BOOLEAN;
FLastUpdate : LONGINT;
FPanels : TStatPanels;
FRefreshInterval : LONGINT;
FUpdater : TUpdateDictionary;
PROCEDURE SetExpanded(Value : BOOLEAN);
PROCEDURE SetPanels(Value : TStatPanels);
PROTECTED
PROCEDURE Notification(AComponent : TComponent ;
Operation : TOperation); OVERRIDE;
PUBLIC
{ Public declarations }
CONSTRUCTOR Create(AOwner : TComponent); OVERRIDE;
PROCEDURE UpdateStats;
PUBLISHED
PROPERTY Expanded : BOOLEAN READ FExpanded WRITE SetExpanded DEFAULT FALSE;
PROPERTY Panels : TStatPanels READ FPanels WRITE SetPanels DEFAULT [spCache,spMemory];
PROPERTY RefreshInterval : LONGINT READ FRefreshInterval WRITE FRefreshInterval DEFAULT 500;
PROPERTY Updater : TUpdateDictionary READ FUpdater WRITE FUpdater;
END;
TUpdateStats = CLASS(TComponent)
PRIVATE
FExpanded : BOOLEAN;
FForm : TUpdateStatsForm;
FPanels : TStatPanels;
FRefreshInterval : LONGINT;
FUpdater : TUpdateDictionary;
PROCEDURE SetExpanded(Value : BOOLEAN);
PROCEDURE SetPanels(Value : TStatPanels);
PROCEDURE SetUpdater(Value : TUpdateDictionary);
PROCEDURE Resync;
PROTECTED
PROCEDURE Notification(AComponent : TComponent ;
Operation : TOperation); OVERRIDE;
PUBLIC
CONSTRUCTOR Create(AOwner : TComponent); OVERRIDE;
PROCEDURE UpdateStats;
PROPERTY Form : TUpdateStatsForm READ FForm;
PUBLISHED
PROPERTY Expanded : BOOLEAN READ FExpanded WRITE SetExpanded DEFAULT FALSE;
PROPERTY Panels : TStatPanels READ FPanels WRITE SetPanels DEFAULT [spCache,spMemory];
PROPERTY RefreshInterval : LONGINT READ FRefreshInterval WRITE FRefreshInterval DEFAULT 500;
PROPERTY Updater : TUpdateDictionary READ FUpdater WRITE SetUpdater;
END;
TUpdateTable = CLASS(TUpdateTablePrim)
PRIVATE
FUpdateStats : TUpdateStats;
PROCEDURE SetUpdater(Value : TUpdateDictionary);
PROTECTED
PROCEDURE DoAfterDelete; OVERRIDE;
PROCEDURE DoAfterPost; OVERRIDE;
PROCEDURE DoBeforeDelete; OVERRIDE;
PROCEDURE DoBeforeEdit; OVERRIDE;
PROCEDURE DoBeforeInsert; OVERRIDE;
PROCEDURE Notification(AComponent: TComponent; Operation: TOperation); OVERRIDE;
PROPERTY Updater : TUpdateDictionary READ FUpdater WRITE SetUpdater;
PUBLIC
CONSTRUCTOR Create(AOwner : TComponent); OVERRIDE;
PUBLISHED
PROPERTY UpdateStats : TUpdateStats READ FUpdateStats WRITE FUpdateStats;
END;
VAR
UpdateStatsForm: TUpdateStatsForm;
IMPLEMENTATION
{$R *.DFM}
PROCEDURE TUpdateStatsForm.SetPanels(Value : TStatPanels);
VAR NewTop : INTEGER;
PROCEDURE SetNewTop(P : TPanel);
BEGIN
IF P.Visible THEN
BEGIN
P.Top := NewTop;
INC(NewTop,P.Height + 7)
END
END;
BEGIN
IF Value <> FPanels THEN
BEGIN
CachePanel.Visible := spCache IN Value;
MemoryPanel.Visible := spMemory IN Value;
WordsPanel.Visible := spWords IN Value;
LRUPanel.Visible := spLRU IN Value;
NewTop := CachePanel.Top;
SetNewTop(CachePanel);
SetNewTop(MemoryPanel);
SetNewTop(WordsPanel);
SetNewTop(LRUPanel);
ResetBtn.Top := NewTop;
FlushBtn.Top := NewTop;
ClientHeight := NewTop + ResetBtn.Height + 7;
FPanels := Value;
CacheMenuItem.Checked := CachePanel.Visible;
MemoryMenuItem.Checked := MemoryPanel.Visible;
WordsMenuItem.Checked := WordsPanel.Visible;
LRUMenuItem.Checked := LRUPanel.Visible;
UpdateStats;
END
END;
PROCEDURE TUpdateStatsForm.SetExpanded(Value : BOOLEAN);
PROCEDURE SetWidths(PWidth, FWidth : INTEGER ; IsVisible : BOOLEAN);
BEGIN
CachePanel.Width := PWidth;
MemoryPanel.Width := PWidth;
WordsPanel.Width := PWidth;
LRUPanel.Width := PWidth;
Width := FWidth;
BlobLabel.Visible := IsVisible;
BlobReads.Visible := IsVisible;
BlobWrites.Visible := IsVisible;
MemLimitLabel.Visible := IsVisible;
MemoryLimit.Visible := IsVisible;
UnWrittenLabel.Visible := IsVisible;
UnWritten.Visible := IsVisible;
{ CacheCount.Visible := IsVisible; }
LRUFlushLabel.Visible := IsVisible;
FlushLRU.Visible := IsVisible;
END;
BEGIN
IF Value <> FExpanded THEN
BEGIN
FExpanded := Value;
ExpandMenuItem.Checked := Value;
IF Value THEN
BEGIN
SetWidths(193 + 64,223 + 64,TRUE);
UpdateStats
END
ELSE SetWidths(193,223,FALSE)
END
END;
PROCEDURE TUpdateStatsForm.UpdateStats;
VAR CS : TCacheStats;
Tics : LONGINT;
BEGIN
IF (FUpdater = NIL) OR (WindowState = wsMinimized) THEN EXIT;
Tics := GetTickCount;
IF Tics - FLastUpdate <= FRefreshInterval THEN EXIT;
FLastUpdate := Tics;
IF CachePanel.Visible THEN
BEGIN
CacheReads.Caption := IntToStr(FUpdater.CacheReads);
DiskReads.Caption := IntToStr(FUpdater.DiskReads);
CacheEdits.Caption := IntToStr(FUpdater.CacheEdits);
CacheInserts.Caption:= IntToStr(FUpdater.CacheInserts);
DiskInserts.Caption := IntToStr(FUpdater.DiskInserts);
DiskEdits.Caption := IntToStr(FUpdater.DiskEdits);
DiskDeletes.Caption := IntToStr(FUpdater.DiskDeletes);
BlobWrites.Caption := IntToStr(FUpdater.BlobBytesWritten);
BlobReads.Caption := IntToStr(FUpdater.BlobBytesRead)
END;
IF MemoryPanel.Visible THEN
BEGIN
MemUsage.Caption := IntToStr(FUpdater.MemoryUsage DIV 1000);
MaxMemUsed.Caption := IntToStr(FUpdater.MaxMemUsed DIV 1000);
MemoryLimit.Caption := IntToStr(FUpdater.MemoryLimit DIV 1000)
END;
IF WordsPanel.Visible THEN
BEGIN
FUpdater.GetCacheStats(CS);
UnCompressed.Caption := IntToStr(CS.UnCompressed);
Compressed.Caption := IntToStr(CS.Compressed);
IF Unwritten.Visible THEN
UnWritten.Caption := IntToStr(CS.Unwritten);
{ Unassigned.Caption := IntToStr(CS.Unassigned); }
{ CacheCount.Caption := IntToStr(FUpdater.CacheCount) }
END;
IF LRUPanel.Visible THEN
BEGIN
IF NOT WordsPanel.Visible THEN FUpdater.GetCacheStats(CS);
LRU.Caption := IntToStr(CS.LRU);
CompressLRU.Caption := IntToStr(CS.CompressLRU);
FlushLRU.Caption := IntToStr(CS.FlushLRU)
END;
Application.ProcessMessages;
END;
PROCEDURE TUpdateStatsForm.ResetBtnClick(Sender: TObject);
BEGIN
IF FUpdater <> NIL THEN
BEGIN
FUpdater.ResetStats;
UpdateStats
END
END;
PROCEDURE TUpdateStatsForm.ExpandBtnClick(Sender: TObject);
BEGIN
Expanded := NOT Expanded
END;
PROCEDURE TUpdateStatsForm.FormShow(Sender: TObject);
BEGIN
FLastUpdate := 0;
UpdateStats
END;
PROCEDURE TUpdateStatsForm.Notification(AComponent : TComponent ;
Operation : TOperation);
BEGIN
IF (Operation = opRemove) AND
(AComponent = FUpdater) THEN
FUpdater := NIL;
IF (Operation = opInsert) AND
(FUpdater = NIL) AND
(csDesigning IN ComponentState) AND
(AComponent IS TUpdateDictionary) THEN
FUpdater := TUpdateDictionary(AComponent)
END;
CONSTRUCTOR TUpdateStatsForm.Create(AOwner : TComponent);
BEGIN
INHERITED Create(AOwner);
FExpanded := TRUE;
Expanded := FALSE;
Panels := [spCache,spMemory];
FRefreshInterval := 500
END;
PROCEDURE TUpdateStatsForm.HidePanelDblClick(Sender: TObject);
begin
Panels := Panels - [TStatPanel((Sender AS TPanel).Tag)]
end;
PROCEDURE TUpdateStatsForm.FormDblClick(Sender: TObject);
begin
Panels := [spCache..spLRU]
end;
PROCEDURE TUpdateStatsForm.MenuItemClick(Sender: TObject);
begin
WITH Sender AS TMenuItem DO
BEGIN
Checked := NOT Checked;
IF Checked THEN Panels := Panels + [TStatPanel(Tag)]
ELSE Panels := Panels - [TStatPanel(Tag)]
END
end;
PROCEDURE TUpdateStatsForm.FlushBtnClick(Sender: TObject);
begin
IF FUpdater <> NIL THEN
BEGIN
FUpdater.FlushCache;
UpdateStats
END
end;
{******************************* TUpdateStats *********************************}
CONSTRUCTOR TUpdateStats.Create(AOwner : TComponent);
VAR i : INTEGER;
BEGIN
INHERITED Create(AOwner);
FExpanded := FALSE;
FPanels := [spCache,spWords];
FRefreshInterval := 500;
IF Assigned(AOwner) AND
(csDesigning IN ComponentState) THEN
FOR i := 1 TO AOwner.ComponentCount - 1 DO
IF AOwner.Components[i] IS TUpdateTable THEN
WITH TUpdateTable(AOwner.Components[i]) DO
IF NOT Assigned(FUpdateStats) THEN
BEGIN
UpdateStats := Self;
IF Assigned(FUpdater) THEN Self.Updater := FUpdater;
BREAK
END
END;
PROCEDURE TUpdateStats.SetExpanded(Value : BOOLEAN);
BEGIN
FExpanded := Value;
Resync
END;
PROCEDURE TUpdateStats.SetPanels(Value : TStatPanels);
BEGIN
FPanels := Value;
Resync
END;
PROCEDURE TUpdateStats.SetUpdater(Value : TUpdateDictionary);
BEGIN
FUpdater := Value;
Resync
END;
PROCEDURE TUpdateStats.UpdateStats;
VAR i : INTEGER;
BEGIN
IF NOT Assigned(FUpdater) AND
(Owner <> NIL) THEN
FOR i := 0 TO Owner.ComponentCount - 1 DO
IF Owner.Components[i] IS TUpdateTable THEN
WITH TUpdateTable(Owner.Components[i]) DO
IF Assigned(FUpdater) THEN Self.Updater := FUpdater;
IF FUpdater = NIL THEN EXIT;
IF FForm = NIL THEN
BEGIN
FForm := TUpdateStatsForm.Create(Self);
FForm.Show;
Resync
END;
FForm.UpdateStats
END;
PROCEDURE TUpdateStats.Notification(AComponent : TComponent ;
Operation : TOperation);
BEGIN
IF (Operation = opRemove) AND
(AComponent = FUpdater) THEN
FUpdater := NIL;
IF (Operation = opInsert) AND
(csDesigning IN ComponentState) AND
(FUpdater = NIL) AND
(AComponent IS TUpdateDictionary) THEN
FUpdater := TUpdateDictionary(AComponent)
END;
PROCEDURE TUpdateStats.Resync;
BEGIN
IF FForm <> NIL THEN
BEGIN
FForm.Expanded := FExpanded;
FForm.Panels := FPanels;
FForm.RefreshInterval := FRefreshInterval;
FForm.Updater := FUpdater
END
END;
{******************************* TUpdateTable *********************************}
CONSTRUCTOR TUpdateTable.Create(AOwner : TComponent);
BEGIN
INHERITED Create(AOwner);
END;
PROCEDURE TUpdateTable.SetUpdater(Value : TUpdateDictionary);
BEGIN
FUpdater := Value;
IF Assigned(FUpdateStats) THEN FUpdateStats.Updater := Value
END;
PROCEDURE TUpdateTable.DoAfterDelete;
BEGIN
INHERITED DoAfterDelete;
IF Assigned(FUpdater) THEN
BEGIN
FUpdater.AfterDelete;
IF Assigned(FUpdateStats) THEN FUpdateStats.UpdateStats
END
END;
PROCEDURE TUpdateTable.DoAfterPost;
BEGIN
INHERITED DoAfterPost;
IF Assigned(FUpdater) THEN
BEGIN
FUpdater.AfterPost;
IF Assigned(FUpdateStats) THEN FUpdateStats.UpdateStats
END
END;
PROCEDURE TUpdateTable.DoBeforeDelete;
BEGIN
INHERITED DoBeforeDelete;
IF Assigned(FUpdater) THEN FUpdater.BeforeDelete
END;
PROCEDURE TUpdateTable.DoBeforeEdit;
BEGIN
INHERITED DoBeforeEdit;
IF Assigned(FUpdater) THEN FUpdater.BeforeEdit
END;
PROCEDURE TUpdateTable.DoBeforeInsert;
BEGIN
INHERITED DoBeforeInsert;
IF Assigned(FUpdater) THEN FUpdater.BeforeInsert
END;
PROCEDURE TUpdateTable.Notification(AComponent : TComponent ;
Operation : TOperation);
BEGIN
INHERITED Notification(AComponent, Operation);
IF Operation = opRemove THEN
IF AComponent = FUpdater THEN Updater := NIL
ELSE IF AComponent = FUpdateStats THEN FUpdateStats := NIL;
IF (Operation = opInsert) AND
NOT Assigned(FUpdateStats) AND
(csDesigning IN ComponentState) AND
(AComponent IS TUpdateStats) THEN
BEGIN
FUpdateStats := TUpdateStats(AComponent);
FUpdateStats.FUpdater := FUpdater
END
END;
END.